package BehaviorPattern.Memento;

/**
 * @author: Themberfue
 * @date: 2025/8/14 11:01
 * @description:
 */
// 1. 备忘录：存储文本编辑器的状态
class TextMemento {
    private final String content; // 存储的文本内容
    private final int cursorPosition; // 光标位置

    // 构造方法私有，只能由发起人创建
    public TextMemento(String content, int cursorPosition) {
        this.content = content;
        this.cursorPosition = cursorPosition;
    }

    // 仅提供给发起人访问状态的方法
    public String getContent() {
        return content;
    }

    public int getCursorPosition() {
        return cursorPosition;
    }
}

// 2. 发起人：文本编辑器
class TextEditor {
    private String content; // 当前文本内容
    private int cursorPosition; // 当前光标位置

    public TextEditor() {
        this.content = "";
        this.cursorPosition = 0;
    }

    // 输入文本
    public void type(String text) {
        content = content.substring(0, cursorPosition) + text + content.substring(cursorPosition);
        cursorPosition += text.length();
        System.out.println("输入后: " + content + " (光标在" + cursorPosition + "位置)");
    }

    // 移动光标
    public void moveCursor(int position) {
        if (position >= 0 && position <= content.length()) {
            this.cursorPosition = position;
            System.out.println("光标移动到: " + cursorPosition);
        }
    }

    // 创建备忘录，保存当前状态
    public TextMemento createMemento() {
        return new TextMemento(content, cursorPosition);
    }

    // 从备忘录恢复状态
    public void restoreFromMemento(TextMemento memento) {
        this.content = memento.getContent();
        this.cursorPosition = memento.getCursorPosition();
        System.out.println("恢复后: " + content + " (光标在" + cursorPosition + "位置)");
    }

    public String getContent() {
        return content;
    }
}

// 3. 管理者：负责保存和管理备忘录
class Caretaker {
    private java.util.Stack<TextMemento> history = new java.util.Stack<>();

    // 保存备忘录
    public void saveState(TextEditor editor) {
        history.push(editor.createMemento());
        System.out.println("已保存状态，当前历史记录数: " + history.size());
    }

    // 撤销操作：恢复到上一个状态
    public void undo(TextEditor editor) {
        if (!history.isEmpty()) {
            TextMemento memento = history.pop();
            editor.restoreFromMemento(memento);
            System.out.println("撤销后，剩余历史记录数: " + history.size());
        } else {
            System.out.println("没有可撤销的状态");
        }
    }
}

// 4. 客户端代码
public class MementoExample {
    public static void main(String[] args) {
        // 创建文本编辑器和管理者
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        // 操作1：输入并保存
        editor.type("Hello ");
        caretaker.saveState(editor);

        // 操作2：继续输入并保存
        editor.type("World!");
        caretaker.saveState(editor);

        // 操作3：移动光标并输入
        editor.moveCursor(6);
        editor.type("beautiful ");
        System.out.println("最终文本: " + editor.getContent());

        // 第一次撤销
        System.out.println("\n执行第一次撤销:");
        caretaker.undo(editor);

        // 第二次撤销
        System.out.println("\n执行第二次撤销:");
        caretaker.undo(editor);

        // 尝试第三次撤销
        System.out.println("\n尝试第三次撤销:");
        caretaker.undo(editor);
    }
}

